package cn.com.inossem.utils;

import android.annotation.SuppressLint;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 * 主要实现了日期的常用操作
 */
@SuppressLint("SimpleDateFormat")
public final class CrashDateUtil {

	/**
	 * yyyy-MM-dd HH:mm:ss字符串
	 */
	public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

	/**
	 * yyyy-MM-dd字符串
	 */
	public static final String DEFAULT_FORMAT_DATE = "yyyy-MM-dd";

	/**
	 * HH:mm:ss字符串
	 */
	public static final String DEFAULT_FORMAT_TIME = "HH:mm:ss";

	/**
	 * yyyy-MM-dd HH:mm:ss格式
	 */
	public static final ThreadLocal<SimpleDateFormat> defaultDateTimeFormat = new ThreadLocal<SimpleDateFormat>() {

		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
		}

	};

	/**
	 * yyyy-MM-dd格式
	 */
	public static final ThreadLocal<SimpleDateFormat> defaultDateFormat = new ThreadLocal<SimpleDateFormat>() {

		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat(DEFAULT_FORMAT_DATE);
		}

	};

	/**
	 * HH:mm:ss格式
	 */
	public static final ThreadLocal<SimpleDateFormat> defaultTimeFormat = new ThreadLocal<SimpleDateFormat>() {

		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat(DEFAULT_FORMAT_TIME);
		}

	};

	private CrashDateUtil() {
		throw new RuntimeException("￣ 3￣");
	}

	/**
	 * 将long时间转成yyyy-MM-dd HH:mm:ss字符串<br>
	 *
	 * @param timeInMillis 时间long值
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String getDateTimeFromMillis(long timeInMillis) {
		return getDateTimeFormat(new Date(timeInMillis));
	}

	/**
	 * 将long时间转成yyyy-MM-dd字符串<br>
	 *
	 * @param timeInMillis
	 * @return yyyy-MM-dd
	 */
	public static String getDateFromMillis(long timeInMillis) {
		return getDateFormat(new Date(timeInMillis));
	}

	/**
	 * 将date转成yyyy-MM-dd HH:mm:ss字符串
	 * <br>
	 *
	 * @param date Date对象
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String getDateTimeFormat(Date date) {
		return dateSimpleFormat(date, defaultDateTimeFormat.get());
	}

	/**
	 * 将年月日的int转成yyyy-MM-dd的字符串
	 *
	 * @param year  年
	 * @param month 月 1-12
	 * @param day   日
	 *              注：月表示Calendar的月，比实际小1
	 *              对输入项未做判断
	 */
	public static String getDateFormat(int year, int month, int day) {
		return getDateFormat(getDate(year, month, day));
	}

	/**
	 * 将date转成yyyy-MM-dd字符串<br>
	 *
	 * @param date Date对象
	 * @return yyyy-MM-dd
	 */
	public static String getDateFormat(Date date) {
		return dateSimpleFormat(date, defaultDateFormat.get());
	}

	/**
	 * 获得HH:mm:ss的时间
	 *
	 * @param date
	 * @return
	 */
	public static String getTimeFormat(Date date) {
		return dateSimpleFormat(date, defaultTimeFormat.get());
	}

	/**
	 * 格式化日期显示格式
	 *
	 * @param sdate  原始日期格式 "yyyy-MM-dd"
	 * @param format 格式化后日期格式
	 * @return 格式化后的日期显示
	 */
	public static String dateFormat(String sdate, String format) {
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		java.sql.Date date = java.sql.Date.valueOf(sdate);
		return dateSimpleFormat(date, formatter);
	}

	/**
	 * 格式化日期显示格式
	 *
	 * @param date   Date对象
	 * @param format 格式化后日期格式
	 * @return 格式化后的日期显示
	 */
	public static String dateFormat(Date date, String format) {
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return dateSimpleFormat(date, formatter);
	}

	/**
	 * 将date转成字符串
	 *
	 * @param date   Date
	 * @param format SimpleDateFormat
	 *               <br>
	 *               注： SimpleDateFormat为空时，采用默认的yyyy-MM-dd HH:mm:ss格式
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String dateSimpleFormat(Date date, SimpleDateFormat format) {
		if (format == null)
			format = defaultDateTimeFormat.get();
		return (date == null ? "" : format.format(date));
	}

	/**
	 * 将"yyyy-MM-dd HH:mm:ss" 格式的字符串转成Date
	 *
	 * @param strDate 时间字符串
	 * @return Date
	 */
	public static Date getDateByDateTimeFormat(String strDate) {
		return getDateByFormat(strDate, defaultDateTimeFormat.get());
	}

	/**
	 * 将"yyyy-MM-dd" 格式的字符串转成Date
	 *
	 * @param strDate
	 * @return Date
	 */
	public static Date getDateByDateFormat(String strDate) {
		return getDateByFormat(strDate, defaultDateFormat.get());
	}

	/**
	 * 将指定格式的时间字符串转成Date对象
	 *
	 * @param strDate 时间字符串
	 * @param format  格式化字符串
	 * @return Date
	 */
	public static Date getDateByFormat(String strDate, String format) {
		return getDateByFormat(strDate, new SimpleDateFormat(format));
	}

	/**
	 * 将String字符串按照一定格式转成Date<br>
	 * 注： SimpleDateFormat为空时，采用默认的yyyy-MM-dd HH:mm:ss格式
	 *
	 * @param strDate 时间字符串
	 * @param format  SimpleDateFormat对象
	 * @throws ParseException 日期格式转换出错
	 */
	private static Date getDateByFormat(String strDate, SimpleDateFormat format) {
		if (format == null)
			format = defaultDateTimeFormat.get();
		try {
			return format.parse(strDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将年月日的int转成date
	 *
	 * @param year  年
	 * @param month 月 1-12
	 * @param day   日
	 *              注：月表示Calendar的月，比实际小1
	 */
	public static Date getDate(int year, int month, int day) {
		Calendar mCalendar = Calendar.getInstance();
		mCalendar.set(year, month - 1, day);
		return mCalendar.getTime();
	}

	/**
	 * 求两个日期相差天数
	 *
	 * @param strat 起始日期，格式yyyy-MM-dd
	 * @param end   终止日期，格式yyyy-MM-dd
	 * @return 两个日期相差天数
	 */
	public static long getIntervalDays(String strat, String end) {
		return ((java.sql.Date.valueOf(end)).getTime() - (java.sql.Date
				.valueOf(strat)).getTime()) / (3600 * 24 * 1000);
	}

	/**
	 * 获得当前年份
	 *
	 * @return year(int)
	 */
	public static int getCurrentYear() {
		Calendar mCalendar = Calendar.getInstance();
		return mCalendar.get(Calendar.YEAR);
	}

	/**
	 * 获得当前月份
	 *
	 * @return month(int) 1-12
	 */
	public static int getCurrentMonth() {
		Calendar mCalendar = Calendar.getInstance();
		return mCalendar.get(Calendar.MONTH) + 1;
	}

	/**
	 * 获得当月几号
	 *
	 * @return day(int)
	 */
	public static int getDayOfMonth() {
		Calendar mCalendar = Calendar.getInstance();
		return mCalendar.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 获得今天的日期(格式：yyyy-MM-dd)
	 *
	 * @return yyyy-MM-dd
	 */
	public static String getToday() {
		Calendar mCalendar = Calendar.getInstance();
		return getDateFormat(mCalendar.getTime());
	}

	/**
	 * 获得昨天的日期(格式：yyyy-MM-dd)
	 *
	 * @return yyyy-MM-dd
	 */
	public static String getYesterday() {
		Calendar mCalendar = Calendar.getInstance();
		mCalendar.add(Calendar.DATE, -1);
		return getDateFormat(mCalendar.getTime());
	}

	/**
	 * 获得前天的日期(格式：yyyy-MM-dd)
	 *
	 * @return yyyy-MM-dd
	 */
	public static String getBeforeYesterday() {
		Calendar mCalendar = Calendar.getInstance();
		mCalendar.add(Calendar.DATE, -2);
		return getDateFormat(mCalendar.getTime());
	}

	/**
	 * 获得几天之前或者几天之后的日期
	 *
	 * @param diff 差值：正的往后推，负的往前推
	 * @return
	 */
	public static String getOtherDay(int diff) {
		Calendar mCalendar = Calendar.getInstance();
		mCalendar.add(Calendar.DATE, diff);
		return getDateFormat(mCalendar.getTime());
	}

	/**
	 * 取得给定日期加上一定天数后的日期对象.
	 *
	 * @param sDate  给定的日期对象
	 * @param amount 需要添加的天数，如果是向前的天数，使用负数就可以.
	 * @return Date 加上一定天数以后的Date对象.
	 */
	public static String getCalcDateFormat(String sDate, int amount) {
		Date date = getCalcDate(getDateByDateFormat(sDate), amount);
		return getDateFormat(date);
	}

	/**
	 * 取得给定日期加上一定天数后的日期对象.
	 *
	 * @param date   给定的日期对象
	 * @param amount 需要添加的天数，如果是向前的天数，使用负数就可以.
	 * @return Date 加上一定天数以后的Date对象.
	 */
	public static Date getCalcDate(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, amount);
		return cal.getTime();
	}

	/**
	 * 获得一个计算十分秒之后的日期对象
	 *
	 * @param date
	 * @param hOffset 时偏移量，可为负
	 * @param mOffset 分偏移量，可为负
	 * @param sOffset 秒偏移量，可为负
	 * @return
	 */
	public static Date getCalcTime(Date date, int hOffset, int mOffset, int sOffset) {
		Calendar cal = Calendar.getInstance();
		if (date != null)
			cal.setTime(date);
		cal.add(Calendar.HOUR_OF_DAY, hOffset);
		cal.add(Calendar.MINUTE, mOffset);
		cal.add(Calendar.SECOND, sOffset);
		return cal.getTime();
	}

	/**
	 * 根据指定的年月日小时分秒，返回一个java.Util.Date对象。
	 *
	 * @param year      年
	 * @param month     月 0-11
	 * @param date      日
	 * @param hourOfDay 小时 0-23
	 * @param minute    分 0-59
	 * @param second    秒 0-59
	 * @return 一个Date对象
	 */
	public static Date getDate(int year, int month, int date, int hourOfDay,
	                           int minute, int second) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month, date, hourOfDay, minute, second);
		return cal.getTime();
	}

	/**
	 * 获得年月日数据
	 *
	 * @param sDate yyyy-MM-dd格式
	 * @return arr[0]:年， arr[1]:月 0-11 , arr[2]日
	 */
	public static int[] getYearMonthAndDayFrom(String sDate) {
		return getYearMonthAndDayFromDate(getDateByDateFormat(sDate));
	}

	/**
	 * 获得年月日数据
	 *
	 * @return arr[0]:年， arr[1]:月 0-11 , arr[2]日
	 */
	public static int[] getYearMonthAndDayFromDate(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int[] arr = new int[3];
		arr[0] = calendar.get(Calendar.YEAR);
		arr[1] = calendar.get(Calendar.MONTH);
		arr[2] = calendar.get(Calendar.DAY_OF_MONTH);
		return arr;
	}
}
